package day02

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

/**
  * 如何区分算子操作的分类：
  * transformation：返回的是rdd类型，延迟加载，只是记录转换的元数据信息及转换算子记录操作
  *
  * action：返回数值类型，立即执行
  *
  * map&mapPartitions的区别：
  * map作用于每一个元素
  * mapPartitions：作用于每个分区
  * 应用场景：
  * 对于元素的转换操作用map操作
  * 对于数据要写入到mysql当中，需要连接数据库
  * nap：有十个元素，连接数据库的时候，会创建10个数据库连接
  * mapPartitions：十个元素（3个分区）：连接数据库的时候，会创建3个数据库连接
  *
  *
  * groupByKye与reduceByKey的区别：
  * reduceByKey多了个函数的操作，应用更加灵活
  *
  * sortByKey与sortBy的区别：
  * sortBy多了函数的操作，更加灵活
  *
  *
  * coalesce与repartition区别：
  * coalesce只能减少分区
  * repartition：可以增加也可以减少分区
  *
  */
object RDDTest {
  def main(args: Array[String]): Unit = {
    //初始化
    val sparkConf: SparkConf = new SparkConf().setAppName("RDDTest").setMaster("local[2]")
    val sc: SparkContext = new SparkContext(sparkConf)
    //设置日志级别
    sc.setLogLevel("WARN");
    //通过已经存在的集合进行创建RDD   应用场景：字典数据/26字母/省份
    val rdd1: RDD[Int] = sc.parallelize(Array(1,2,3,4,5,6,7,8,9))
    //通过外部的存储介质来创建RDD      应用场景：hdfs/mysql/s3
    val rdd2: RDD[String] = sc.textFile("hdfs://node01:8020/text.txt")
    //通过已经存在的Rdd生成新的Rdd     应用场景：业务处理
    val rdd3: RDD[String] = rdd2.flatMap(_.split(" "))
    //过滤操作
    val filter: RDD[String] = rdd3.filter(x=>x.startsWith("spark")==true)

  }
}
